package org.chartsy.mrswing;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
import java.util.prefs.Preferences;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.chartsy.main.data.DataItem;
import org.chartsy.main.data.DataProvider;
import org.chartsy.main.data.Dataset;
import org.chartsy.main.data.Stock;
import org.chartsy.main.data.StockNode;
import org.chartsy.main.data.StockSet;
import org.chartsy.main.exceptions.InvalidStockException;
import org.chartsy.main.exceptions.RegistrationException;
import org.chartsy.main.exceptions.StockNotFoundException;
import org.chartsy.main.intervals.Interval;
import org.chartsy.main.managers.ProxyManager;
import org.chartsy.main.utils.SerialVersion;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
/**
*
* @author viorel.gheba
*/
public class MrSwing extends DataProvider
{
private static final long serialVersionUID = SerialVersion.APPVERSION;
public MrSwing()
{
super(NbBundle.getBundle(MrSwing.class));
usedCookies.clear();
usedCookies.add("PHPSESSID");
usedCookies.add("amember_nr");
}
@Override
public int getRefreshInterval()
{
return 5;
}
@Override
protected String fetchCompanyName(String symbol)
throws InvalidStockException, StockNotFoundException, RegistrationException, IOException
{
String url = getStockURL(symbol);
BufferedReader in = ProxyManager.getDefault().bufferReaderGET(url);
if (in == null)
throw new StockNotFoundException();
String firstLine = in.readLine();
if (!firstLine.equals("OK"))
throw new RegistrationException(
NbBundle.getMessage(MrSwing.class, "MSG_Registration"));
String inputLine = in.readLine();
if (inputLine.equals("0"))
throw new InvalidStockException();
return inputLine;
}
@Override
protected Dataset fetchDataForFavorites(Stock stock)
throws IOException, ParseException
{
synchronized ((stock.toString() + "-" + DAILY.getTimeParam()).intern())
{
Dataset result = null;
List<DataItem> items = new ArrayList<DataItem>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
BufferedReader bufferedReader = null;
String uri = getDataURL(stock, DAILY) + "&limit=2";
bufferedReader = ProxyManager.getDefault().bufferReaderGET(uri);
String inputLine = bufferedReader.readLine();
if (inputLine.equals("OK")) // check first line
{
bufferedReader.readLine(); // ignore first 2 lines
while ((inputLine = bufferedReader.readLine()) != null)
{
String[] values = inputLine.split(",");
long time = df.parse(values[0]).getTime();
double open = Double.parseDouble(values[1]);
double high = Double.parseDouble(values[2]);
double low = Double.parseDouble(values[3]);
double close = Double.parseDouble(values[4]);
double volume = Double.parseDouble(values[5]);
DataItem item = new DataItem(time, open, high, low, close, volume);
items.add(item);
}
Collections.sort(items);
result = new Dataset(items);
}
bufferedReader.close();
return result;
}
}
@Override
protected Dataset fetchData(Stock stock, Interval interval)
throws IOException, ParseException
{
synchronized ((stock.toString() + "-" + interval.getTimeParam()).intern())
{
Dataset result = null;
List<DataItem> items = new ArrayList<DataItem>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
BufferedReader bufferedReader = null;
String uri = getDataURL(stock, interval);
bufferedReader = ProxyManager.getDefault().bufferReaderGET(uri);
String inputLine = bufferedReader.readLine();
if (inputLine.equals("OK")) // check first line
{
bufferedReader.readLine(); // ignore first 2 lines
while ((inputLine = bufferedReader.readLine()) != null)
{
String[] values = inputLine.split(",");
long time = df.parse(values[0]).getTime();
double open = Double.parseDouble(values[1]);
double high = Double.parseDouble(values[2]);
double low = Double.parseDouble(values[3]);
double close = Double.parseDouble(values[4]);
double volume = Double.parseDouble(values[5]);
DataItem item = new DataItem(time, open, high, low, close, volume);
items.add(item);
}
Collections.sort(items);
result = new Dataset(items);
}
bufferedReader.close();
return result;
}
}
@Override
protected DataItem fetchLastDataItem(Stock stock, Interval interval)
throws IOException, ParseException
{
synchronized ((stock.toString() + "-" + interval.getTimeParam()).intern())
{
DataItem dataItem = null;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
BufferedReader bufferedReader = null;
String uri = getDataURL(stock, interval) + "&limit=1";
bufferedReader = ProxyManager.getDefault().bufferReaderGET(uri);
String inputLine = bufferedReader.readLine();
if (inputLine.equals("OK")) // check first line
{
bufferedReader.readLine(); // ignore first 2 lines
while ((inputLine = bufferedReader.readLine()) != null)
{
String[] values = inputLine.split(",");
long time = df.parse(values[0]).getTime();
double open = Double.parseDouble(values[1]);
double high = Double.parseDouble(values[2]);
double low = Double.parseDouble(values[3]);
double close = Double.parseDouble(values[4]);
double volume = Double.parseDouble(values[5]);
dataItem = new DataItem(time, open, high, low, close, volume);
}
}
bufferedReader.close();
/*Dataset result = fetchData(stock, interval);
if (result != null)
{
int last = dataset.getLastIndex();
DataItem newItem = result.getDataItem(result.getLastIndex());
DataItem oldItem = dataset.getDataItem(dataset.getLastIndex());
if (newItem.getTime() != oldItem.getTime())
{
dataset.addDataItem(newItem);
} else
{
dataset.setDataItem(last, newItem);
}
}
return dataset;*/
return dataItem;
}
}
private String getUsername()
{
Preferences p = NbPreferences.root().node("/org/chartsy/register");
return p.get("username", null);
}
private String getPassword()
{
Preferences p = NbPreferences.root().node("/org/chartsy/register");
return p.get("password", null);
}
@Override
public StockSet fetchAutocomplete(String text)
throws IOException
{
String url = getAutocompleteURL(text);
StockSet result = new StockSet();
final HttpClient client = ProxyManager.getDefault().getHttpClient();
final GetMethod method = new GetMethod(url);
client.executeMethod(method);
InputStream inputStream = method.getResponseBodyAsStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String inputLine;
while ((inputLine = bufferedReader.readLine()) != null)
{
StringTokenizer st = new StringTokenizer(inputLine, ":");
String key = st.nextToken();
String company = st.nextToken();
String exchange = st.nextToken();
result.add(new StockNode(key, company, exchange));
}
bufferedReader.close();
method.releaseConnection();
return result;
}
private String getStockURL(String symbol)
throws UnsupportedEncodingException
{
return NbBundle.getMessage(MrSwing.class, "Stock_URL", new String[]
{
URLEncoder.encode(symbol, "UTF-8"),
getUsername(),
getPassword()
});
}
private String getDataURL(Stock stock, Interval interval)
throws UnsupportedEncodingException
{
return NbBundle.getMessage(MrSwing.class, "Data_URL", new String[]
{
URLEncoder.encode(stock.getKey(), "UTF-8"),
URLEncoder.encode(interval.getTimeParam(), "UTF-8"),
getUsername(),
getPassword()
});
}
private String getAutocompleteURL(String word)
throws UnsupportedEncodingException
{
return NbBundle.getMessage(MrSwing.class, "Autocomplete_URL", URLEncoder.encode(word, "UTF-8"));
}
private List<String> usedCookies = new ArrayList<String>();
}